package com.impl;

import com.dao.UserDAO;
import com.model.UserDO;
import com.utils.BizException;
import com.utils.CheckUtil;
import com.utils.CommonUtil;
import com.utils.DBUtil;
import com.vo.UserVO;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Random;

public class UserDAOImpl implements UserDAO {

    private Connection conn = null;

    private PreparedStatement ps;

    private ResultSet rs;

    private ArrayList<UserDO> userList = new ArrayList<UserDO>();


    /**
     * 注册功能，添加用户
     */
    @Override
    public int register(String phone, String password) throws BizException {
        String sql = "insert into user(username, phone, password) values(?, ?, ?)";
        if (!CheckUtil.isPhone(phone)) {//如果匹配失败
            throw new BizException("手机号码格式不正确");
        }
        UserDO user = getUserByPhone(phone); //查询数据库中是否已经存在该手机号注册的用户，把结果集第一个用户返回
        if (user != null) { //如果存在用户
            throw new BizException("手机号已被注册");//抛出异常
        }

        String username = "乡云购" + CommonUtil.getStringRandom(6);//定义用户名为乡云购+六位随机用户名
        int row = 0;
        try {
            conn = DBUtil.getConnection();//建立数据库链接
            ps = conn.prepareStatement(sql);//创建一个prepareStatement对象，执行带参数的SQL语句
            ps.setString(1, username);
            ps.setString(2, phone);
            ps.setString(3, password);
            row = ps.executeUpdate();//返回插入数据后更改的行数

        } catch (SQLException e) {
            e.printStackTrace();
        }

        if (row == 0) {
            throw new BizException("注册失败");
        }

        return row;
    }


    /**
     * 通过手机号找用户
     */
    public UserDO getUserByPhone(String phone) {//查询数据库是否已经存在该手机号注册的用户
        String sql = "select * from user where phone = ?";//查询phone的sql语句
        UserDO userDO = null;//声明userDO对象，并初始化为null
        try {
            conn = DBUtil.getConnection();//建立数据库链接
            ps = conn.prepareStatement(sql);//创建一个prepareStatement对象，执行带参数的SQL语句
            ps.setString(1, phone);//把传入的电话字符串当阐述放入sql语句
            rs = ps.executeQuery();//执行sql语句查询返回ResultSet对象rs
            userList = getByRs(rs);//把结果集放入一个用户列表
            userDO = userList.size() == 0 ? null : userList.get(0);//判断用户列表长度是否为0如果不为零把列表第一个值赋值为userDO
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return userDO;//返回结果集的第一个用户
    }

    /**
     * 登录
     */

    @Override
    public UserVO login(String phone, String password) throws BizException{
        String sql = "select * from user where phone = ?";
        UserDO userDO = null; //声明userDO对象，并初始化为null
        UserVO userVO = null;
        try {
            conn = DBUtil.getConnection(); // 建立数据库链接
            ps = conn.prepareStatement(sql);// 创建一个prepareStatement对象，执行带参数的SQL语句
            ps.setString(1, phone);//把传入的用户名放入sql语句
            rs = ps.executeQuery(); // 执行sql语句查询返回ResultSet对象rs
            userList = getByRs(rs); // 把结果集放入一个用户列表
            userDO = userList.size() == 0 ? null : userList.get(0); // 判断用户列表长度是否为0如果不为零把列表第一个值赋值为userDO
            if (userDO == null) {
                throw new BizException("用户不存在");
            }

            if (!userDO.getPassword().equals(password)) {
                throw new BizException("手机号或密码错误");
            }

            userVO = new UserVO();
            try {
                BeanUtils.copyProperties(userVO, userDO);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return userVO; //返回结果集的第一个用户
    }

    /**
     * 遍历结果集，封装到ArrayList
     */
    public ArrayList<UserDO> getByRs(ResultSet rs) {//遍历结果集，把结果存入一个用户列表
        try {
            if (rs == null || !rs.next()) {//如果结果集为空或rs为空
                return new ArrayList<UserDO>();//返回空列表
            }
            userList.clear();//清空用户列表

            do {//打印
                UserDO userDO = new UserDO();//每次都声明一个userDO对象，把数据都放进去
                userDO.setId(rs.getInt("id"));
                userDO.setUsername(rs.getString("username"));
                userDO.setPassword(rs.getString("password"));
                userDO.setPhone(rs.getString("phone"));
                userDO.setSex(rs.getString("sex"));
                userDO.setAvatar(rs.getString("avatar"));
                userList.add(userDO);//把userDO对象添加到userList列表
            } while (rs.next());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close();
        }
        return userList;//返回遍历后的用户列表
    }

    /**
     * 修改密码功能
     */

    @Override
    public void updatePassword(String phone, String newPassword, String code) throws BizException {//修改密码的方法
        String sql = "UPDATE user SET password=? WHERE phone=?";
        if (!code.equals("12345")) {
            throw new BizException("短信验证码错误");
        }
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sql);
            ps.setString(1, newPassword);
            ps.setString(2, phone);
            int row = ps.executeUpdate();
            if (row == 0) {
                throw new BizException("未找到该手机号注册的用户");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new BizException("修改密码失败");
        } finally {
            close();
        }
    }


    /**
     * 清除
     */
    public void close() {
        DBUtil.close(conn, ps, rs);
    }


}


